perm filename NPROM.FAI[CMS,LCS]6 blob sn#356835 filedate 1978-05-26 generic text, type T, neo UTF8
00100	COMMENT ⊗   VALID 00012 PAGES
00200	C REC  PAGE   DESCRIPTION
00300	C00001 00001
00400	C00002 00002		NEW MONITOR AND BOOTSTRAP PROM.
00500	C00003 00003	RESET
00600	C00005 00004	Disk load routine
00700	C00007 00005	START
00800	C00010 00006	Clear screen sub
00900	C00011 00007	Display DDT
01000	C00014 00008	CKCMD:	CMPI	"/"	Examine
01100	C00015 00009	PRINT ADDRESS/VAL
01200	C00017 00010	Reset chr dpy
01300	C00019 00011	DISPLAY CHR
01400	C00021 00012	Paper tape loader	Interupt driven?
01500	C00023 ENDMK
01600	C⊗;
     

00100	;	NEW MONITOR AND BOOTSTRAP PROM.
00200	
00300		.INSERT ASMBL.FAI
00400	
00500	; ZPAGE RAM
00600	
00700	TFLG:	0
00800	VAL:	0
00900	ADR:	0
01000		0
01100	
01200		BLOCK 15	;OLD DDT RAM
01300	
01400	CUR:	0	;Cursor
01500		0
01600	SD:	0	;Screen edges
01700	ED:	0
01800	
01900	RAS:	0	;Dpy control defaults
02000	ROW:	0
02100	DPY:	0
02200	MIX:	0
02300	
02400	BRCODE:	0	;Default bit rate
02500	RSCODE:	0	;Default acia control word
02600	KBCODE:	0	;Default keyboard control word
     

00100	;RESET
00200	LOC 177274	;LOC 177000
00300	   SRSTR←UNDEF	;System reset register
00400	   RSTREG←UNDEF	;POWER ON RESET REG
00500	
00600	PORCK:	BIT	RSTREG	;Check if power on reset
00700		BVS	CKMODE
00800	
00900	RST:	LDXI	377	;Stack depth
01000		TXS		;Set stack
01100		CLD		;Clear decimal mode
01200	
01300		JSR	CLRDPY	;Clear screen
01400		JSR	SETVEC	;Setup default IRQ vectors
01500		JSR	JMPSET	;Reset ram jumps
01600			;Setup start addresses
01700	
01800	;CKMODE:	PHA	;Save A??
01900			;Reset system
02000		LDA	RSTREG
02100		ANDI	60	;RST mode bits
02200		BNE	CKM1
02300		JMP	OLDDDT	;Old DDT
02400	CKM1:	CMPI	40
02500		BCS	CKM2
02600		JMP	LEDDDT	;KB LED DDT
02700	CKM2:	BNE	FBOOT
02800		JMP	DPYDDT	;Display DDT
02900	
03000	   DSKSEL←176437;Floppy select
03100	   FBAD←1400	;Floppy bootstrap start address
03200	   IBMR←163	;IBM read command
03300	
03400	FBOOT:	LDAI	RTI	;Dissable non maskable interupt
03500		STA	NMIV
03600		JSR	RESTOR	;Restore?
03700			;Seek track
03800		BIT	RSTREG	;Check if power on reset
03900		BVS	NOPOR
04000			;Wait for disk
04100	
04200	NOPOR:	LDAI	0	;Floppy boot start addr. low
04300		STAZ	FBADL
04400		LDAI	2	;Fboot start addr. high
04500		STAZ	FBADH
04600		LDXI	1	;Number of sectors
04700		LDAI	IBMR	;Read IBM sector
04800		STAZ	FDC
04900	
05000		JSR	FLOAD	;Load from disk
05100			;Check for error
05200	
05300		JMP	FBAD
     

00100	;Disk load routine
00200	   FDSKC←176420	;DISK COMMAND REGISTER
00300	   FDSKT←176421	;DISK TRACK REGISTER
00400	   FDSKS←176422	;DISK SECTOR REGISTER
00500	   FDSKD←176423	;DISK DATA REGISTER
00600	FLOAD:	LDAI	34	;Reset disk servo
00700		STA	DSKSEL
00800		LDAZ	DSEL	;20 = Head unloaded and
00900		STA	DSKSEL	;disk init disabled.
01000	
01100		LDAZ	SEC
01200		STA	FDSKS	;Setup sector #
01300			;Init data reg?
01400	
01500		LDXI	2	;Setup timer jump
01600	JLOOP:	LDAX	RJMP
01700		STAX	NMIV
01800		DEX
01900		BPL	JLOOP
02000	
02100		LDAI	UNDEF
02200		STA	RTCAH	;Setup time out
02300		LDAI	17	;17 = Load, /16, NMI, IEN
02400		STA	RTCAC
02500	
02600		LDAI	163	;Read 1 IBM sector (128 bytes)
02700		STA	FDSKC
02800	
02900		LDYI	0
03000	DSKL:	BIT	DSKSEL	
03100		BPL	DSKL	;Wait until byte ready
03200		LDA	FDSKD
03300		STAIY	FBAD	;Load it
03400		INY
03500		BNE	DSKL
03600	
03700		LDAI	0
03800	RSTT:	LDXI	0	;Disable timer
03900		STA	RTCAC
04000			;Set / reset error bits
04100		RTS
04200	
04300	RJMP:	JMP	FBTO
04400	
04500	FBTO:	PLA		;Flush stack
04600		PLA
04700		PLA
04800		LDAI	TOBIT	;Set time out error bit
04900		JMP	RSTT
     

00100	;START
00200	   BOOTS←1000	;BOOTSTRAP START ADDRESS
00300	DMAINT:
00400	DSKINT:	
00500		JMP	BOOTS	;JUMP TO BOOT START
00600	
00700	;Reset ram jumps.
00800	JMPSET:	LDXI	UNDEF	;Number of jumps * 2
00900	JSET:	LDAX	JMPDEF
01000		STAZX	RJMP	;Jump table setup loop
01100		DEX
01200		BPL	JSET
01300		RTS
01400	
01500	;Default ram jumps
01600	JMPDEF:	
01700	
01800	;Setup interrupt vectors.
01900	   IVECT←176360	;Ram interrupt vector table address
02000	SETVEC:	LDXI	17	;Number of vectors * 2
02100	IVSET:	LDAX	IVDEF	;Default vector setup loop
02200		STAX	IVECT
02300		DEX
02400		BPL	IVSET
02500	
02600	   PRIC←176436	;PRI control register
02700		LDAI	UNDEF	;Setup pri control register.
02800		STA	PRIC
02900		RTS
03000	
03100	;Default interupt vectors.
03200	IVDEF:	IVERR	;Error
03300		PROM
03400		IVERR	;Error
03500		PROM
03600		UNLOAD	;Disable head preload
03700		PROM
03800		MODINT	;TTY default
03900		PROM
04000		DMAINT	;Disk load and boot
04100		PROM
04200		DSKINT	;Disk load and boot
04300		PROM
     

00100	;Clear screen sub
00200	CLRDPY:	LDAI	0
00300		STAZ	CUR
00400		LDAZ	SD	;Get top of screen
00500		STAZ	CUR+1
00600		LDYI	0
00700		LDAI	" "	;<Space>
00800	CLRL:	STAIY	CUR
00900		INY
01000		BNE	CLRL
01100		INCZ	CUR+1
01200		LDXZ	CUR+1
01300		CPXZ	ED	;Bottom of screen
01400		BCC	CLRL
01500		RTS
01600	
01700	;SETUP DMA
01800	   FDMAA←176400	;FDSK DMA ADDRESS REGISTER
01900	   FDMAC←176401	;FDSK COUNT REGISTER
02000	   DMACON←176410;DMA COMMAND REGISTER
02100		LDAI	0	;RESET DMA
02200		STA	DMACON
02300		STA	FDMAA	;SETUP DMA ADDRESS
02400		LDAI	2	;1000
02500		STA	FDMAA
02600		LDAI	377	;SETUP DMA COUNT
02700		STA	FDMAC
02800		LDAI	201	;CNT=512-1
02900		STA	FDMAC
03000		LDAI	141	;ENABLE FDSK DMA
03100		IVERR	;Error
     

00100	;Display DDT
00200	DPYDDT:	LDAI	20	;Unload disk head??
00300		STA	DSKSEL
00400	
00500		JSR	RCDPY	;Setup display defaults
00600			;Reset ACIA(S), BRG, MOD
00700			;Setup KB chr map?
00800	DBRIN0:	PHA
00900		LDAI	RTI	;Disable NMI
01000		STA	NMIV
01100		PLA
01200	
01300	DBRIN1:	JSR	SVSTAT	;Save state?
01400	
01500		JSR	SETKB
01600		JSR	SETDPY
01700			;Init I/O?
01800	;DPY DDT loop
01900	PCR:	LDAI	15	;PRINT <cr>.
02000		JSR	RPCHR
02100	PLF:	LDAI	12
02200		JSR	RPCHR	;PRINT <cr>
02300	GNEXT:	JSR	RGCHR	;Wait for next chr
02400		ANDI	177
02500	
02600	;RAM JUMP
02700	
02800	ECHO:	JSR	RPCHR	;Echo it
02900		CMPI	12	;<lf>
03000		BEQ	LF
03100		CMPI	60	;Check for octal digit
03200		BCC	CKCMD
03300		CMPI	70
03400		BCS	CKCMD
03500	
03600		ANDI	7
03700		LDXI	3
03800	SHFT:	ASLZ	TMP
03900		ROLZ	TMP+1
04000		DEX
04100		BNE	SHFT
04200	
04300		ORAZ	TMP
04400		STAZ	TMP
04500		INCZ	TFLG	;Set number flag
04600	
04700		JMP	GNEXT	;Wait for next chr
     

00100	CKCMD:	CMPI	"/"	;Examine
00200		BEQ	SETAD
00300		CMPI	UNDEF	;"↑"
00400		BEQ	UPARO
00500		CMPI	UNDEF	;<Tab>
00600		BEQ	TAB
00700		CMPI	UNDEF	;<Btab>
00800		BEQ	BTAB
00900		CMPI	UNDEF	;<Baddr>
01000		BEQ	BADDR
01100		CMPI	UNDEF	;<Jaddr>
01200		BEQ	JADDR
01300		CMPI	"P"	;Proceed
01400		BEQ	GO
01500		CMPI	"T"	;TTY
01600		BEQ	TTY
01700		CMPI	UNDEF	;TVT
01800		BEQ	TVT
01900		CMPI	"B"	;Modem boot
02000		BEQ	MBOOT
02100		CMPI	"L"	;Modem load
02200		BEQ	MLOAD
02300		CMPI	"U"	;Modem unload
02400		BEQ	MUNLOD
02500	
02600	ERROR:	JMP	GNEXT
     

00100	;PRINT ADDRESS/VAL
00200	PAV:	LDXI	0
00300		LDAI	1	;# OF DIGITS
00400		STAZ	NDIG
00500		STAZ	TFLG	;SET BIT MASK
00600		LDYI	2	;# OF BITS + C
00700		JSR	RLOOP	;PRINT "0" OR "1"
00800		LDAI	5
00900		STAZ	NDIG
01000		LDAI	7
01100		STAZ	TFLG
01200		JSR	CLOOP	;PRINT 5 OCTAL DIGITS
01300		LDAI	"/"
01400		JSR	PCHR	;PRINT "/"
01500		LDAI	1
01600		STAZ	NDIG
01700		LDYI	3
01800		STYZ	TFLG
01900		JSR	DLOOP	;PRINT "0" - "3"
02000		LDAI	2
02100		STAZ	NDIG
02200		LDAI	7
02300		STAZ	TFLG
02400		JSR	CLOOP	;PRINT 2 OCTAL DIGITS
02500		RTS
02600	
02700	CLOOP:	LDYI	3	;FOR 3 BITS PER DIGIT
02800	RLOOP:	ROLZ	VAL	;ROTATE ADDRESS AND VALUE
02900		ROLZ	ADR
03000		ROLZ	ADR+1
03100	DLOOP:	DEY
03200		BNE	RLOOP
03300		LDAZ	VAL	;GET NEXT DIGIT
03400		ANDZ	TFLG
03500		ORAI	60	;CONVERT TO ASCII
03600		JSR	RPCHR	;PRINT IT (Ram jump)
03700		DECZ	NDIG
03800		BNE	CLOOP	;NEXT DIGIT
03900		RTS
     

00100	;Reset chr dpy
00200	RCDPY:	LDAI	0	;Reset cursor
00300		STAZ	CUR
00400		LDAI	DPYRAM
00500		STAZ	CUR+1
00600	
00700	   RASTER←171760;RASTER OFFSET
00800	   CHRROW←171761;CHR ROW OFFSET
00900	   DPYC←171764	;VIDIO CONTROL
01000	   VMIX←171765	;VIDIO MIXER
01100		LDAI	14	;SET UP DPY DEFAULTS
01200		STAZ	RAS	;SHOULD BE 0,0
01300		LDAI	377
01400		STAZ	ROW
01500		LDAI	100	;CURSOR ENABLE
01600		STAZ	DPY
01700		LDAI	1	;NORMAL MIX
01800		STAZ	MIX
01900	
02000	;Setup screen edges
02100		LDAI	200
02200		STAZ	SD	;Upper edge
02300		LDAI	210
02400		STAZ	ED	;lower edge
02500	
02600	;Reset key board defaults
02700	   KBD←173370	;KB DATA REGISTER
02800	   KBC←173371	;KB CONTROL REGISTER
02900		LDAI	UNDEF	;RESET KB DEFAULT
03000		STAZ	KBCODE
03100	
03200		RTS
03300	
03400	;Reset brate and acia defaults
03500	   RSDEF←25	;ACIA CONTROL DEFAULT
03600	RMOD:	LDAI	15	;Set bit rate to 300
03700		STAZ	BRCODE
03800		LDAI	RSDEF	;SETUP ACIA DEFAULT
03900		STAZ	RSCODE
04000	
04100		LDAI	3
04200		STA	ACIAC	;Reset ACIA?
04300	
04400		RTS
     

00100	;DISPLAY CHR
00200	PDPY:	LDYI	0	;?
00300		STAIY	CUR	;WRITE CHR INTO CHRDPY MEM
00400	
00500		INCZ	CUR	;INCREMENT CURSOR
00600		LDAZ	CUR
00700		ANDI	77	;CHECK IF OFF RIGHT EDGE
00800		BEQ	CRLF	;CLEAR NEXT LINE
00900	
01000	   CURREG←171762	;CURSOR CONTROL REGISTERS
01100	UPCUR:	LDAZ	CUR	;UPDATE CURSOR
01200		STA	CURREG
01300		LDAZ	CUR+1
01400		STA	CURREG+1
01500		RTS
01600	
01700	CRLF:	LDAZ	CUR	;FIX CURSOR
01800		SEC
01900		SBCI	100	;Chr per line
02000		STAZ	CUR	;Fall through to line feed
02100	
02200	;LINE FEED
02300	LF:	CLC
02400		LDAZ	CUR
02500		ADCI	100	;NEXT LINE
02600		STAZ	CUR
02700		BCC	NOTOFF
02800		INCZ	CUR+1
02900		LDAZ	CUR+1
03000		CMPZ	ED	;BOTTOM OF SCREEN
03100		BEQ	GLITCH
03200	;Clear to end of line sub
03300	CTEOL:	LDAZ	CUR
03400		ANDI	77
03500		EORI	77
03600		TAY
03700		LDAI	40	;<space>
03800	CLR:	STAIY	CUR
03900		DEY
04000		BNE	CLR
04100		RTS
04200	
04300	GLITCH:	
04400		RTS
     

00100	;Paper tape loader	Interupt driven?
00200	PTLOAD:	
00300	PTW1:	BIT	CRB0	;Wait  for chr
00400		BPL	PTW1
00500		LDA	PRA0	;Get chr
00600		CMPI	UNDEF
00700		BEQ	PTW1	;Check if record mark
00800	
00900			;Intel hex, PDP-11 bin, or ? (cksum, etc.)
01000	
01100	
01200	;Prom reset and interupt vectors
01300	   LOC 200266	;LOC 177772
01400	
01500	NMIV:	NMIINT	;Prom Non maskable interupt vector
01600		PROM
01700	
01800	RSTV:	RST	;Prom reset vector
01900		PROM
02000	
02100	;Prom interupt request vector
02200	IRQV:	0	;0 for PIV enable
02300		0
02400	END